<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>封装ajax</title>
	<script>
		function myAjax(type,url,params,datatype,callback,async){
			// 1创建对象
			var xhr = null;
			// 2判断浏览器兼容性
			if(window.XMLHttpRequest){
				xhr = new XMLHttpRequest();
			}else{
				xhr = new ActionXObjct('Microsoft.XMLHTTP');
			}
			// 3准备发送
			if(type=='get') {
				// get请求必须在路径后？+参数
				if(params && params!=''){
					url+='?'+params;
				}
				
			}
			xhr.open(type,url,true);
			// 4执行发送 
			if(type=='get'){
				xhr.send(null);
			}else if(type=='post'){
				// post必须设置请求头，带参数
				xhr.setRequestHeader('Content_Type','application/x-www-form-urlencoded');
				xhr.send(params);
			}
			// 如果是异步
			if(async){
				xhr.onreadystatechange = function(){
					if(xhr.readyState == 4 && xhr.status == 200){
						var result = null;
						if(datatype=='xml'){
							result=xhr.responseXML;
						}else if(datatype=='json'){
							result = xhr.responseText;
							result = JSON.parse(result);
						}
						else{
							result = xhr.responseText;
						}
						if(callback){
							callback(result);
						}
						
					}
				}
			}else{
				// 否则，如果是同步请求
				var result = null;
						if(datatype=='xml'){
							result=xhr.responseXML;
						}else if(datatype=='json'){
							result = xhr.responseText;
							result = JSON.parse(result);
						}
						else{
							result = xhr.responseText;
						}
						if(callback){
							callback(result);
						}
			}
			
		}




// 优化ajax封装，使得传递的参数顺序可以改变，也给参数预定义了默认值，不需要每次都传递
		obj{
			type:'get';
			datatype: 'json'
		};

		function myAjax2(obj){
			var defaults = {
				type: 'get',
				url: '#',
				datatype: 'json',
				// datatype必须强制定义，可以是个'text'，否则将一个不是的数据转成json对象就会报错
				// 将参数以对象的形式存储起来
				data: {},
				async: true,
				success: function(result){},
			};
			// obj中的属性，覆盖到default中的属性
			// 如果有一些属性只存在obj中，会在default中新增属性
			// 如果有一些属性在obj和default中都有，会在default中覆盖掉预定义的属性
			// 如果有一些属性只在default中，在obj中不存在，那么default中会保留属性
			for(var key in obj){
				defaults[key] = obj[key];
			}

			var xhr = null;
			if(window.XMLHttpRequest){
				xhr = new XMLHttpRequest();
			}else{
				xhr = new ActionXObjct('Microsoft.XMLHTTP');
			}
			xhr.open(defaults.type,defaults.url,defaults.async);

			var params = '';
			for(var attr in defaults.data){
				params+=attr+'='+defaults.data[attr]+'&';
			}
			if(params){
				params = params.substring(0,params.length-1);
			}
			if(defaults.type=='get'){
				defaults.url+='?'+params;
			}
			xhr.open(defaults.type,defaults.url,defaults.async);

			if(defaults.type=='get'){
				xhr.send(null);
			}else if(defaults.type=='post'){
				xhr.setRequestHeader('Content_Type','application/x-www-form-urlencoded');
				xhr.send(params);
			}

			if(defaults.async){
				xhr.onreadystatechange = function(){
					if(xhr.readyState == 4 && xhr.status == 200){
						var result = null;
						if(defaults.datatype=='xml'){
							result=xhr.responseXML;
						}else if(defaults.datatype=='json'){
							result = xhr.responseText;
							result = JSON.parse(result);
						}
						else{
							result = xhr.responseText;
						}
						defaults.success(result);
						
					}
				}
			}else{
				// 否则，如果是同步请求
				var result = null;
						if(datatype=='xml'){
							result=xhr.responseXML;
						}else if(datatype=='json'){
							result = xhr.responseText;
							result = JSON.parse(result);
						}
						else{
							result = xhr.responseText;
						}
						defaults.success(result);
						
			}

		}
	</script>
</head>
<body>
	
</body>
</html>